查看原文
其他

独家实践 | 使用最新发布的 AllenNLP 训练一个词性标注模型

2017-09-13 集智小仙女 集智AI学园


前言:

前日,人工智能圈的自然语言处理领域(NLP,Natural Language Processing)出了个大事情,著名的艾伦人工智能研究院开源了基于PyTorch的强大NLP处理工具包AllenNLP!NLP领域的研发者们都为之而兴奋。然而在大家都争相报道这条新闻的时候,却没有一家能给出使用AllenNLP搭建实用模型的教程。别人做不出的教程我们集智AI学园!经过两日的整理与实践,今天我们就把AllenNLP实操教程呈现给大家!

在本教程中,我会带领大家使用AllenNLP构建一个词性标注模型,从搭建网络到训练以及评估,整个流程都非常简单,由此也看出 AllenNLP 是非常实用的 NLP 工具包。

本期内容:

  • 使用 AllenNLP 训练一个词性标注模型

  • 评估模型

  • 使用模型进行词性预测

  • 下期预告

  • 附录一:笔者在安装 AllenNLP 时遇到的坑

  • 附录二:本期模型配置文件

使用 AllenNLP 训练一个词性标注模型

要使用 AllenNLP,首先需要将它的源码下载到本地进行安装,安装方法可以参考“笔者在安装AllenNLP时遇到的坑”。

git clone https://github.com/allenai/allennlp.git

cd allennlp

本教程的所有命令默认都是在 allennlp 目录下执行的。

在使用 AllenNLP 之前,有两个概念需要科普一下:

  • 1.在 allennlp/allennlp/models 目录下提供了一些定义好的模型,我们这次使用其中的“simple_tagger.py”模型,它由一个词嵌入层和一个LSTM层组成。

  • 在 AllenNLP 中,模型的配置(包括超参数)是通过JSON配置文件来完成的。JSON配置文件是 AllenNLP 的特色之一。

我们本次使用的数据集是 Brown Corpus 语料库的一个子集。在本次实验中,我们将使用4000个随机选择的句子来训练模型,使用另外1000个随机选择的句子作为验证集。

本次实验的JSON配置文件已经定义好,我会在文章末尾附录这个配置文件。在下一篇教程中,我会给大家详细讲解这个配置文件的意义。

而目前,我们只需要注意其中的一部分内容:

"trainer": {

    "num_epochs": 40,

    "patience": 10,

    "cuda_device": -1

 }

这一部分内容指定了我们训练模型的参数。

这里 num_epochs 参数指定我们的训练数据集迭代次数。 在最新的Macbook电脑上上,每次迭代大约需要花费1分钟的时间,所以这个训练大概需要40分钟。  patience 参数控制在迭代完成前停止训练,如果验证数据集正确率在10个迭代周期内没有显著提高,则模型自动停止训练。cuda_device 代表是否使用GPU运算。如果有GPU,可以将cuda_device更改为0以使用它。

你可以对配置的参数进行微调,然后运行:

$ python -m allennlp.run train tutorials/getting_started/simple_tagger.json --serialization_dir /tmp/tutorials/getting_started

参数中:serialization_dir 指定了保存模型单词表和训练权重的位置。

此命令执行后将下载数据集并在本地缓存(数据集下载链接已经配置在JSON中了)。

数据集下载完毕后将开始训练模型并打印训练进度:

accuracy 代表模型预测词性标签的正确率,accuracy3 代表模型预测的“最可能的三种词性”里包含正确结果的概率,loss 就是交叉熵损失,训练的越低越好。

在我电脑上运行至第35个训练周期时,模型准确率趋于稳定,训练自动结束:

accuracy 达到92%,accuracy3 达到97%,其实并不是非常出众的结果,但是对咱们的这个小模型来说,这个正确率已经可以了。

现在模型被训练好了,在我们先前指定的 serialization_dir 目录下已经生成了很多文件。其中在 vocabulary 目录下的是模型生成的单词表,每个单词被编码成了一个整数。

在训练结束后会自动生成一个压缩包“model.tar.gz”,其中包含训练的配置,最佳权重,以及单词表。

评估模型

我们训练好模型后,可以在另一个数据集上对它进行评估。 AllenNLP 在文件 sentence.small.test 中准备了另外1000个句子,我们在命令中加入 URL 将它们下载下来。

我们可以使用 evaluate 命令来评估一个模型,在运行模型时指定给它“模型训练完毕生成的压缩文件的位置”和“评估数据集的位置”:

$ python -m allennlp.run evaluate --archive_file /tmp/tutorials/getting_started/model.tar.gz --evaluation_data_file https://allennlp.s3.amazonaws.com/datasets/getting-started/sentences.small.test

运行此操作时,将加载我们之前训练的模型,同时下载评估数据集,然后进行预测:

模型对评估数据的运行结果出来了,准确率还是相当高的(*^__^*)。

是真正用模型做预测的时间了!

要使用模型对语句进行词性预测,需要使用 predict 命令,同时还需要把输入语句以 JSON 文件的形式提供给模型。

下面是我们的输入文件,只有简单的两条语句。

运行命令,查看预测结果:

$ python -m allennlp.run predict /tmp/tutorials/getting_started/model.tar.gz inputs.txt

... lots of logging omitted

{"tags": ["ppss""bem""vbg""at""nn""."]"class_probabilities": [[ ..]]}

{"tags": ["jj""nn""nn""bez""jj""."]"class_probabilities": [[ ..]]}

这里的“标签”是每个句子的词性标签,“class_probabilities”是每个句子的标签的预测分布(太多了,所以上边省略,见下图)。

可以看到模型进行了正确的预测!Natural 被识别为形容词,language、processing、tutorial都被识别为了名词。

好,那到这里,我们就使用 AllenNLP 成功搭建了一个简单的词性预测模型。AllenNLP 作为一个最新发布的 NLP 处理工具,其功能当然不会仅限于此。所以我们会持续为大家推出探索 AllenNLP 强大功能的实操教程,欢迎大家保持关注!

下期预告

下期:AllenNLP 配置JSON文件解析

下下期:AllenNLP 基本模块 Datasets,Instances,Fields使用详解

还有下下下期:AllenNLP Vocabulary 使用详解

这么多精彩内容,还等什么?快快关注 集智AI学园 公众号!

附录

笔者在安装AllenNLP时趟过的坑

安装 AllenNLP 有多种方式,可以参考(https://github.com/allenai/allennlp/blob/master/tutorials/getting_started/installation.md)

我是通过源码来安装的 AllenNLP,安装命令如下:

git clone https://github.com/allenai/allennlp.git

cd allennlp/

$ INSTALL_TEST_REQUIREMENTS=true scripts/install_requirements.sh

需要注意的问题:

1.一定要使用 Python 3.6 的环境,3.5的环境会报出:

File "/Users/Alex/My/github/allennlp/allennlp/common/registrable.py", line 37

    _registry: Dict[Type, Dict[str, Type]] = defaultdict(dict)

             ^

SyntaxError: invalid syntax

2.下载 en_core_web_sm-1.2.0.tar-2.gz 时出错

在从源码安装 AllenNLP 的过程中会自动执行“python -m spacy download en”命令去下载“en_core_web_sm-1.2.0.tar-2.gz”,此时我遇到了Http超时的错误。虽然错误没有导致 AllenNLP 安装失败,但还是感觉少点什么,所以决定手动下载。

解决方法:

我从 Spacy 官网上查到,上面要下载的其实是一个预训练的模型,可以自行下载安装包,再使用 pip 命令手动安装。

pip install /YourPath/en_core_web_md-1.2.1.tar.gz

安装包我帮你下好了,在集智AI学园公众号回复“spacyen”获取网盘地址。


训练本模型的JSON配置文件

{

  "dataset_reader": {

    "type": "sequence_tagging",

    "word_tag_delimiter": "/",

    "token_indexers": {

      "tokens": {

        "type": "single_id",

        "lowercase_tokens": true

      },

      "token_characters": {

        "type": "characters"

      }

    }

  },

  "train_data_path": "https://allennlp.s3.amazonaws.com/datasets/getting-started/sentences.small.train",

  "validation_data_path": "https://allennlp.s3.amazonaws.com/datasets/getting-started/sentences.small.dev",

  "model": {

    "type": "simple_tagger",

    "text_field_embedder": {

            "tokens": {

                    "type": "embedding",

                    "embedding_dim": 50

            },

            "token_characters": {

              "type": "character_encoding",

              "embedding": {

                "embedding_dim": 8

              },

              "encoder": {

                "type": "cnn",

                "embedding_dim": 8,

                "num_filters": 50,

                "ngram_filter_sizes": [5]

              },

              "dropout": 0.2

            }

    },

    "stacked_encoder": {

            "type": "lstm",

            "input_size": 100,

            "hidden_size": 100,

            "num_layers": 2,

            "dropout": 0.5,

            "bidirectional": true

    }

  },

  "iterator": {"type": "basic", "batch_size": 32},

  "trainer": {

    "optimizer": "adam",

    "num_epochs": 40,

    "patience": 10,

    "cuda_device": -1

  }

}

我们将在下期教程里为大家解析这个文件。

感谢大家的关注~

推荐阅读

AI公司职位内推 | 自动驾驶、智慧医疗、智能家居

传奇NLP攻城狮成长之路(一)

教程 | Windows用户指南:如何用Floyd跑PyTorch

《深入浅出GAN-原理与应用》学习笔记

课程推荐 | 进击的强化学习

AI江湖|筑基篇——人工神经网络

深度 | 人工智能让我们失业?不,这取决于我们自己

学员原创 | 人工智能产品经理的新起点(200页PPT下载)

基于神经机器翻译技术的英文修改器养成记 | 集智原创发明

吐血推荐:超级好用的深度学习云平台Floyd | 集智AI学园


关注集智AI学园公众号

获取更多更有趣的AI教程吧!

搜索微信公众号:swarmAI

集智AI学园QQ群:426390994

学园网站:campus.swarma.org


 商务合作|zhangqian@swarma.org     

投稿转载|wangjiannan@swarma.org

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存